/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.intesal.compra.controlador;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import sv.com.intesal.clases.Mensaje;
import sv.com.intesal.clases.XMLReporte;
import sv.com.intesal.compra.bean.Material;
import sv.com.intesal.compra.sql.SQLMaterial;
import sv.com.intesal.conexion.cConexion;
import sv.com.intesal.seguridad.controlador.BitacoraControlador;
import sv.com.intesal.seguridad.controlador.SessionControlador;

/**
 *
 * @author andrew
 */
public class MaterialControlador {

    public List<Material> fillGrid() {
        List<Material> list = new ArrayList<Material>();
        try {
            ResultSet rs = cConexion.conectar().prepareStatement(SQLMaterial.megaSuperFindAllMateriales).executeQuery();
            while (rs.next()) {
                Material ma = new Material();

                /*MATERIAL*/
                ma.setId_m(rs.getInt("id_m"));
                ma.setNombre_m(rs.getString("nombre_m"));
                ma.setDescripcion_m(rs.getString("descripcion_m"));
                ma.setCodigo_barra_m(rs.getString("codigo_barra_m"));
                ma.setCodigo_barra_original_m(rs.getString("codigo_barra_original_m"));

                /*MATERIAL_SUCURSAL*/
                ma.setId_dm(rs.getInt("id_dm"));
                ma.setMaximo_dm(rs.getInt("maximo_ms"));
                ma.setMinimo_dm(rs.getInt("minimo_ms"));
                ma.setUbicacion_dm(rs.getString("ubicacion_ms"));
                ma.setCosto_dm(rs.getDouble("costo_ms"));
                ma.setExistencia_dm(rs.getDouble("cantidad_ms"));
                ma.setEstado_ms(rs.getString("estado_ms"));

                /*CATEGORIA*/
                ma.setId_cat(rs.getInt("id_cat"));
                ma.setId_cat2(rs.getInt("id_cat"));
                ma.setNombre_cat(rs.getString("nombre_cat"));

                /*SUB CATEGORIA*/
                ma.setId_su(rs.getInt("id_su"));
                ma.setId_su2(rs.getInt("id_su"));
                ma.setNombre_su(rs.getString("nombre_su"));

                /*MARCA*/
                ma.setCodigo_m(rs.getInt("codigo_m"));
                ma.setNombre_marca(rs.getString("nombre_m"));

                /*Tipo Material*/
                ma.setCodigo_tm(rs.getInt("codigo_tm"));
                ma.setNombre_tm(rs.getString("nombre_tm"));

                /*UNIDAD DE MEDICION*/
                ma.setId_um(rs.getInt("id_um"));
                ma.setNombre_um(rs.getString("nombre_um"));

                /*SUCURSAL*/
                ma.setCodigo_s(rs.getInt("codigo_s"));
                ma.setNombre_s(rs.getString("nombre_s"));
                list.add(ma);
            }
            rs.close();
            return list;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public void setEnca(Material ma) throws Exception {

        try {
            PreparedStatement ps = null;
            Connection cnn = cConexion.conectar();
            if (ma.getId_m() == 0) {
                ps = cnn.prepareCall(SQLMaterial.InsertarMaterial);
            } else {
                ps = cnn.prepareStatement(SQLMaterial.ModificarMaterial);
                ps.setInt(9, ma.getId_m());
            }
            ps.setInt(1, ma.getId_su());
            ps.setInt(2, ma.getId_um());
            ps.setInt(3, ma.getCodigo_tm());
            ps.setInt(4, ma.getCodigo_m());
            ps.setString(5, ma.getNombre_m());
            ps.setString(6, ma.getDescripcion_m());
            ps.setString(7, ma.getCodigo_barra_m());
            ps.setString(8, ma.getCodigo_barra_original_m());
            ps.executeUpdate();
            ps.close();

            this.setDeta(ma);

            Mensaje m = new Mensaje();
            if (ma.getId_m() == 0) {
                m.messageInfo(m.getIinformation());
            } else {
                m.messageInfo(m.getImodificada());
            }
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private void setDeta(Material m) throws Exception {
        try {
            Integer codigo_ms = m.getId_dm();
            if (m.getId_dm() == null) {
                codigo_ms = this.getMax();
            }

            PreparedStatement ps = null;
            if (m.getId_m() == null) {
                ps = cConexion.conectar().prepareStatement(SQLMaterial.InsetarDetaMaterial);
                ps.setInt(6, codigo_ms);
                ps.setInt(7, 0);
            } else {
                ps = cConexion.conectar().prepareStatement(SQLMaterial.updateDetaMaterial);
                ps.setInt(6, m.getId_dm());
            }

            SessionControlador sc = new SessionControlador();
            ps.setInt(1, sc.getCodigo_Sucursal());
            ps.setString(2, m.getUbicacion_dm());
            ps.setDouble(3, m.getCosto_dm());
            ps.setInt(4, m.getMinimo_dm());
            ps.setInt(5, m.getMaximo_dm());
            ps.executeUpdate();
            ps.close();

        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Integer getMax() throws Exception {
        try {
            ResultSet rs = cConexion.conectar().prepareStatement(SQLMaterial.getMax).executeQuery();
            rs.next();
            return rs.getInt("max");
        } catch (Exception e) {
            throw new Exception(e);
        }
    }


    /*Solicitud de material, Salida de Material por proyecto*/
    public List<Material> fillSolicitudGrid() throws Exception {
        List<Material> list = new ArrayList<Material>();
        try {
            //ResultSet rs = cConexion.conectar().prepareStatement(SQLMaterial.findMateriales).executeQuery();
            ResultSet rs = cConexion.conectar().prepareStatement(SQLMaterial.megaSuperFindAllMateriales).executeQuery();
            while (rs.next()) {
                Material mt = new Material();
                mt.setId_m(rs.getInt("id_m"));
                mt.setNombre_m(rs.getString("nombre_m"));
                mt.setExistencia_dm(rs.getDouble("existencia"));
                mt.setNombre_s(rs.getString("nombre_s"));
                mt.setCodigo_s(rs.getInt("codigo_s"));
                mt.setCodigo_tm(rs.getInt("codigo_tm"));
                mt.setId_dm(rs.getInt("id_dm"));
                list.add(mt);
            }
            rs.close();
            return list;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }
    /* end of solicitud */

    public void setCantidadMaterial_Aumentar_Disminuir(Integer codigo_proceso, Integer id_dm, Double cantidad, String tipoAD, String tipo_bi, String numero_documento, String tipo_proceso) throws Exception {

        try {
            Double existencia_actual = 0.0;
            Double var_existencia_nueva = 0.0;
            existencia_actual = this.getCantidad(id_dm);
//            System.out.println("existencia_actual=" + existencia_actual);
            if (tipoAD.equals("A")) {
                var_existencia_nueva = existencia_actual + cantidad;
            } else {
                var_existencia_nueva = existencia_actual - cantidad;
            }
//            System.out.println("var_existencia_nueva=" + var_existencia_nueva);
//            System.out.println("cantidad=" + cantidad);
            this.setCantidadMaterial(id_dm, var_existencia_nueva);

            BitacoraControlador bc = new BitacoraControlador();
            if (tipoAD.equals("A")) {
                bc.setBitacoraInventario(id_dm, existencia_actual, cantidad, 0.0, var_existencia_nueva, tipo_bi, numero_documento, codigo_proceso, tipo_proceso);
            } else {
                bc.setBitacoraInventario(id_dm, existencia_actual, 0.0, cantidad, var_existencia_nueva, tipo_bi, numero_documento, codigo_proceso, tipo_proceso);
            }
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void setCantidadMaterial(Integer id_dm, Double cantidad) throws Exception {
        Connection cnn = null;
        try {
            cnn = cConexion.conectar();
            PreparedStatement ps = null;
            ps = cnn.prepareStatement(SQLMaterial.modificarCantidad);

            ps.setDouble(1, cantidad);//cantidad
            ps.setInt(2, id_dm);
            ps.executeUpdate();
            ps.close();
            cnn.close();
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Boolean validar_cantidad(Integer id_dm, Double cantidad) throws Exception {
        //falta Fecha un Known, no recuerdo que falta aca? 08-Jului-2011
        try {
            if (this.getCantidad(id_dm) < cantidad) {
                return false;
            }
            return true;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Double getCantidad(Integer id_dm) throws Exception {
        PreparedStatement ps = null;
        Connection cnn = null;
        ResultSet rs = null;
        try {

            SessionControlador sc = new SessionControlador();
            cnn = cConexion.conectar();

            ps = cnn.prepareStatement(SQLMaterial.getCantidadMaterial);
            ps.setInt(1, id_dm);

            rs = ps.executeQuery();
            rs.next();

            Double cantidad = rs.getDouble("cantidad_ms");
            //System.out.println("cantidad traida en el metode getCantidad=" + cantidad);
            ps.close();
            rs.close();
            return cantidad;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Double getCostoMaterialSucursal(Integer id_dm) throws Exception {

        try {
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLMaterial.getCostoMaterial);
            ps.setInt(1, id_dm);
            ResultSet rs = ps.executeQuery();
            rs.next();
            return rs.getDouble("costo_ms");
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void alarmaMaterial_Maximo(Integer id_dm) throws Exception {

        try {
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLMaterial.alarmaMaximo_Material);
            ps.setInt(1, id_dm);
            ResultSet rs = ps.executeQuery();

            if (rs.next()) {
                if (rs.getInt("contar") > 0) {
                    //true activar alarma   //return true;
                    Mensaje m = new Mensaje();
                    //m.messageAdvertencia("CANTIDAD SOBREPASA LA EXISTENCIA EN INVENTARIO");
                    m.messageAdvertencia("CANTIDAD SOBREPASA LA EXISTENCIA EN INVENTARIO. MATERIAL: " + this.getMaterial_x_Codigo(id_dm).getNombre_m());
                }
            } //return false
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void alarmaMaterial_Minimo(Integer id_dm) throws Exception {

        try {
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLMaterial.alarmaMinimo_Material);
            ps.setInt(1, id_dm);
            ResultSet rs = ps.executeQuery();

            if (rs.next()) {
                if (rs.getInt("contar") > 0) {
                    //true activar alarma   //return true;
                    Mensaje m = new Mensaje();
                    //m.messageAdvertencia("HA LLEGADO A CANTIDAD MININA LA EXISTENCIA DE INVENTARIO");
                    m.messageAdvertencia("HA LLEGADO A LA CANTIDAD MININA DE INVENTARIO. MATERIAL: " + this.getMaterial_x_Codigo(id_dm).getNombre_m());
                }
            } //return false
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Material getMaterial_x_Codigo(Integer id_dm) throws Exception {

        try {
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLMaterial.getMaterialActivo_x_Codigo);
            ps.setInt(1, id_dm);
            ResultSet rs = ps.executeQuery();


            Material ma = new Material();
            while (rs.next()) {
                /*MATERIAL*/
                ma.setId_m(rs.getInt("id_m"));
                ma.setNombre_m(rs.getString("nombre_m"));
                ma.setDescripcion_m(rs.getString("descripcion_m"));
                ma.setCodigo_barra_m(rs.getString("codigo_barra_m"));
                ma.setCodigo_barra_original_m(rs.getString("codigo_barra_original_m"));

                /*MATERIAL_SUCURSAL*/
                ma.setId_dm(rs.getInt("id_dm"));
                ma.setMaximo_dm(rs.getInt("maximo_ms"));
                ma.setMinimo_dm(rs.getInt("minimo_ms"));
                ma.setUbicacion_dm(rs.getString("ubicacion_ms"));
                ma.setCosto_dm(rs.getDouble("costo_ms"));
                ma.setExistencia_dm(rs.getDouble("cantidad_ms"));
                ma.setEstado_ms(rs.getString("estado_ms"));

                /*CATEGORIA*/
                ma.setId_cat(rs.getInt("id_cat"));
                ma.setNombre_cat(rs.getString("nombre_cat"));

                /*SUB CATEGORIA*/
                ma.setId_su(rs.getInt("id_su"));
                ma.setNombre_su(rs.getString("nombre_su"));

                /*MARCA*/
                ma.setCodigo_m(rs.getInt("codigo_m"));
                //ma.setNombre_marca(rs.getString("nombre_m"));
                ma.setNombre_marca(rs.getString(25));

                /*Tipo Material*/
                ma.setCodigo_tm(rs.getInt("codigo_tm"));
                ma.setNombre_tm(rs.getString("nombre_tm"));

                /*UNIDAD DE MEDICION*/
                ma.setId_um(rs.getInt("id_um"));
                ma.setNombre_um(rs.getString("nombre_um"));

                /*SUCURSAL*/
                ma.setCodigo_s(rs.getInt("codigo_s"));
                ma.setNombre_s(rs.getString("nombre_s"));
            }
            return ma;
        } catch (Exception e) {
            throw new Exception(e);
        }

    }

    public List<Material> getMaterialesActivo() throws Exception {

        List<Material> list = new ArrayList<Material>();
        try {
            ResultSet rs = cConexion.conectar().prepareStatement(SQLMaterial.getMaterialesActivo).executeQuery();
            while (rs.next()) {
                Material ma = new Material();

                /*MATERIAL*/
                ma.setId_m(rs.getInt("id_m"));
                ma.setNombre_m(rs.getString("nombre_m"));
                ma.setDescripcion_m(rs.getString("descripcion_m"));
                ma.setCodigo_barra_m(rs.getString("codigo_barra_m"));
                ma.setCodigo_barra_original_m(rs.getString("codigo_barra_original_m"));

                /*MATERIAL_SUCURSAL*/
                ma.setId_dm(rs.getInt("id_dm"));
                ma.setMaximo_dm(rs.getInt("maximo_ms"));
                ma.setMinimo_dm(rs.getInt("minimo_ms"));
                ma.setUbicacion_dm(rs.getString("ubicacion_ms"));
                ma.setCosto_dm(rs.getDouble("costo_ms"));
                ma.setExistencia_dm(rs.getDouble("cantidad_ms"));
                ma.setEstado_ms(rs.getString("estado_ms"));

                /*CATEGORIA*/
                ma.setId_cat(rs.getInt("id_cat"));
                ma.setNombre_cat(rs.getString("nombre_cat"));

                /*SUB CATEGORIA*/
                ma.setId_su(rs.getInt("id_su"));
                ma.setNombre_su(rs.getString("nombre_su"));

                /*MARCA*/
                ma.setCodigo_m(rs.getInt("codigo_m"));
                //ma.setNombre_marca(rs.getString("nombre_m"));
                ma.setNombre_marca(rs.getString(25));

                /*Tipo Material*/
                ma.setCodigo_tm(rs.getInt("codigo_tm"));
                ma.setNombre_tm(rs.getString("nombre_tm"));

                /*UNIDAD DE MEDICION*/
                ma.setId_um(rs.getInt("id_um"));
                ma.setNombre_um(rs.getString("nombre_um"));

                /*SUCURSAL*/
                ma.setCodigo_s(rs.getInt("codigo_s"));
                ma.setNombre_s(rs.getString("nombre_s"));
                list.add(ma);
            }
            rs.close();
            return list;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<Material> getMaterialesInactivo() throws Exception {

        List<Material> list = new ArrayList<Material>();
        try {
            ResultSet rs = cConexion.conectar().prepareStatement(SQLMaterial.getMaterialesInactivo).executeQuery();
            while (rs.next()) {
                Material ma = new Material();

                /*MATERIAL*/
                ma.setId_m(rs.getInt("id_m"));
                ma.setNombre_m(rs.getString("nombre_m"));
                ma.setDescripcion_m(rs.getString("descripcion_m"));
                ma.setCodigo_barra_m(rs.getString("codigo_barra_m"));
                ma.setCodigo_barra_original_m(rs.getString("codigo_barra_original_m"));

                /*MATERIAL_SUCURSAL*/
                ma.setId_dm(rs.getInt("id_dm"));
                ma.setMaximo_dm(rs.getInt("maximo_ms"));
                ma.setMinimo_dm(rs.getInt("minimo_ms"));
                ma.setUbicacion_dm(rs.getString("ubicacion_ms"));
                ma.setCosto_dm(rs.getDouble("costo_ms"));
                ma.setExistencia_dm(rs.getDouble("cantidad_ms"));
                ma.setEstado_ms(rs.getString("estado_ms"));

                /*CATEGORIA*/
                ma.setId_cat(rs.getInt("id_cat"));
                ma.setNombre_cat(rs.getString("nombre_cat"));

                /*SUB CATEGORIA*/
                ma.setId_su(rs.getInt("id_su"));
                ma.setNombre_su(rs.getString("nombre_su"));

                /*MARCA*/
                ma.setCodigo_m(rs.getInt("codigo_m"));
                ma.setNombre_marca(rs.getString("nombre_m"));

                /*Tipo Material*/
                ma.setCodigo_tm(rs.getInt("codigo_tm"));
                ma.setNombre_tm(rs.getString("nombre_tm"));

                /*UNIDAD DE MEDICION*/
                ma.setId_um(rs.getInt("id_um"));
                ma.setNombre_um(rs.getString("nombre_um"));

                /*SUCURSAL*/
                ma.setCodigo_s(rs.getInt("codigo_s"));
                ma.setNombre_s(rs.getString("nombre_s"));
                list.add(ma);
            }
            rs.close();
            return list;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<Material> getConsulta_MaximoMinimo(Material ma) throws Exception {

        List<Material> lista = new ArrayList<Material>();
        ResultSet rs = null;

        try {

            String var_maximo = " ", var_minimo = " ", var_negativo = " ", var_producto = " ";
            String var_sucursal = this.getFiltro_Sucursal(ma);
            String var_categoria = this.getFiltro_Material_categoria_subcategoria(ma);

            if (ma.getFlag_maximo() == true) {
                var_maximo = " and ms.maximo_ms<=ms.cantidad_ms ";
            }
            if (ma.getFlag_minimo() == true) {
                var_minimo = " and ms.minimo_ms>= ms.cantidad_ms ";
            }
            if (ma.getFlag_negativo() == true) {
                var_negativo = " and ms.cantidad_ms<0 ";
            }
            if (ma.getId_m() != null) {
                var_producto = " and m.nombre_m like '%" + ma.getNombre_m() + "%' ";
            }

            String filtros = var_maximo + var_minimo + var_negativo + var_producto + var_categoria + var_sucursal;
            String sql = "SELECT m.id_m, m.id_um, m.id_su, m.codigo_tm, m.codigo_m, m.codigo_barra_m, m.codigo_barra_original_m , m.nombre_m, m.descripcion_m,ms.id_dm, ms.codigo_s , ms.costo_ms ,ms.maximo_ms, ms.minimo_ms, ms.ubicacion_ms, ms.cantidad_ms, ms.estado_ms,s.nombre_s,  s.direccion_s, s.fax_s,cat.id_cat, cat.nombre_cat,su.nombre_su, tm.nombre_tm, mar.nombre_m as nombre_marca, um.nombre_um FROM MATERIAL AS m,MATERIAL_SUCURSAL AS ms,SUCURSAL AS s,CATEGORIA AS cat, SUB_CATEGORIA as su,TIPO_MATERIAL as tm,MARCA AS mar, UNIDAD_MEDICION AS um where m.id_m=ms.id_m and s.codigo_s=ms.codigo_s and cat.id_cat=su.id_cat and su.id_su=m.id_su and tm.codigo_tm=m.codigo_tm and mar.codigo_m=m.codigo_m  and um.id_um=m.id_um and ms.estado_ms='A' " + filtros + "order by s.nombre_s,cat.nombre_cat,su.nombre_su,m.nombre_m,m.codigo_barra_m";

            rs = cConexion.conectar().prepareStatement(sql).executeQuery();
            while (rs.next()) {
                Material m = new Material();

                /*categoria*/
                m.setNombre_cat(rs.getString("nombre_cat"));
                m.setId_cat(rs.getInt("id_cat"));

                /*sub categoria*/
                m.setNombre_su(rs.getString("nombre_su"));
                m.setId_su(rs.getInt("id_su"));

                /*UNIDAD MEDICION*/
                m.setId_um(rs.getInt("id_um"));
                m.setNombre_um(rs.getString("nombre_um"));

                /*TIPO MATERIAL*/
                m.setCodigo_tm(rs.getInt("codigo_tm"));
                m.setNombre_tm(rs.getString("nombre_tm"));

                /*MARCA*/
                m.setNombre_marca(rs.getString("nombre_marca"));
                m.setCodigo_m(rs.getInt("codigo_m"));

                /*SUCURSAL*/
                m.setCodigo_s(rs.getInt("codigo_s"));
                m.setNombre_s(rs.getString("nombre_s"));

                /*MATERIAL*/
                m.setNombre_m(rs.getString("nombre_m"));
                m.setDescripcion_m(rs.getString("descripcion_m"));
                m.setCodigo_barra_m(rs.getString("codigo_barra_m"));
                m.setCodigo_barra_original_m(rs.getString("codigo_barra_original_m"));

                /*MATERIAL SUCURSAL*/
                m.setId_dm(rs.getInt("id_dm"));
                m.setMaximo_dm(rs.getInt("maximo_ms"));
                m.setMinimo_dm(rs.getInt("minimo_ms"));
                m.setExistencia_dm(rs.getDouble("cantidad_ms"));
                lista.add(m);
            }
            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<Material> getConsulta_ConteoFisico(Material ma) throws Exception {

        List<Material> lista = new ArrayList<Material>();

        try {
            String var_maximo = " ", var_minimo = " ", var_negativo = " ", var_producto = " ";
            String var_categoria = " ", var_sucursal = " ";

            if (ma.getId_m() != null) {
                var_producto = " and m.nombre_m like '%" + ma.getNombre_m() + "%' ";
            }

            var_categoria = this.getFiltro_Material_categoria_subcategoria(ma);
            var_sucursal = this.getFiltro_Sucursal(ma);

            String filtros = var_maximo + var_minimo + var_negativo + var_producto + var_categoria + var_sucursal;

            String sql = "SELECT m.id_m, m.id_um, m.id_su, m.codigo_tm, m.codigo_m, m.codigo_barra_m, m.codigo_barra_original_m , m.nombre_m, m.descripcion_m,ms.id_dm, ms.codigo_s , ms.costo_ms ,ms.maximo_ms, ms.minimo_ms, ms.ubicacion_ms, ms.cantidad_ms, ms.estado_ms,s.nombre_s,  s.direccion_s, s.fax_s,cat.id_cat, cat.nombre_cat,su.nombre_su, tm.nombre_tm, mar.nombre_m as nombre_marca, um.nombre_um FROM MATERIAL AS m,MATERIAL_SUCURSAL AS ms,SUCURSAL AS s,CATEGORIA AS cat, SUB_CATEGORIA as su,TIPO_MATERIAL as tm,MARCA AS mar, UNIDAD_MEDICION AS um where m.id_m=ms.id_m and s.codigo_s=ms.codigo_s and cat.id_cat=su.id_cat and su.id_su=m.id_su and tm.codigo_tm=m.codigo_tm and mar.codigo_m=m.codigo_m  and um.id_um=m.id_um and ms.estado_ms='A' " + filtros + "order by s.nombre_s,cat.nombre_cat,su.nombre_su,m.nombre_m,m.codigo_barra_m";
            ResultSet rs = cConexion.conectar().prepareStatement(sql).executeQuery();
            while (rs.next()) {
                Material m = new Material();

                /*categoria*/
                m.setNombre_cat(rs.getString("nombre_cat"));
                m.setId_cat(rs.getInt("id_cat"));

                /*sub categoria*/
                m.setNombre_su(rs.getString("nombre_su"));
                m.setId_su(rs.getInt("id_su"));

                /*UNIDAD MEDICION*/
                m.setId_um(rs.getInt("id_um"));
                m.setNombre_um(rs.getString("nombre_um"));

                /*TIPO MATERIAL*/
                m.setCodigo_tm(rs.getInt("codigo_tm"));
                m.setNombre_tm(rs.getString("nombre_tm"));

                /*MARCA*/
                m.setNombre_marca(rs.getString("nombre_marca"));
                m.setCodigo_m(rs.getInt("codigo_m"));

                /*SUCURSAL*/
                m.setCodigo_s(rs.getInt("codigo_s"));
                m.setNombre_s(rs.getString("nombre_s"));

                /*MATERIAL*/
                m.setNombre_m(rs.getString("nombre_m"));
                m.setDescripcion_m(rs.getString("descripcion_m"));
                m.setCodigo_barra_m(rs.getString("codigo_barra_m"));
                m.setCodigo_barra_original_m(rs.getString("codigo_barra_original_m"));

                /*MATERIAL SUCURSAL*/
                m.setId_dm(rs.getInt("id_dm"));
                m.setMaximo_dm(rs.getInt("maximo_ms"));
                m.setMinimo_dm(rs.getInt("minimo_ms"));
                m.setExistencia_dm(rs.getDouble("cantidad_ms"));
                lista.add(m);
            }
            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<Material> getConsultaMateriales(Material m) throws Exception {
        List<Material> lista = new ArrayList<Material>();
        try {

            String sql = "SELECT m.id_m, m.id_um, m.id_su, m.codigo_tm, m.codigo_m, m.codigo_barra_m, m.codigo_barra_original_m , m.nombre_m, m.descripcion_m,ms.id_dm, ms.codigo_s , ms.costo_ms ,ms.maximo_ms, ms.minimo_ms, ms.ubicacion_ms, ms.cantidad_ms, ms.estado_ms,s.nombre_s,  s.direccion_s, s.fax_s,cat.id_cat, cat.nombre_cat,su.nombre_su, tm.nombre_tm, mar.nombre_m as nombre_marca, um.nombre_um FROM MATERIAL AS m,MATERIAL_SUCURSAL AS ms,SUCURSAL AS s,CATEGORIA AS cat, SUB_CATEGORIA as su,TIPO_MATERIAL as tm,MARCA AS mar, UNIDAD_MEDICION AS um where m.id_m=ms.id_m and s.codigo_s=ms.codigo_s and cat.id_cat=su.id_cat and su.id_su=m.id_su and tm.codigo_tm=m.codigo_tm and mar.codigo_m=m.codigo_m  and um.id_um=m.id_um and ms.estado_ms='A' ";
            sql += this.getFiltro_Material_categoria_subcategoria(m) + this.getFiltro_Material_marca(m) +  this.getFiltro_Material_Unidad(m) + this.getFiltro_Material_TipoMaterial(m) + this.getFiltro_Sucursal(m);
            sql += " order by s.nombre_s,cat.nombre_cat,su.nombre_su,m.nombre_m,m.codigo_barra_m ";

            System.out.println(sql);
            PreparedStatement ps = cConexion.conectar().prepareStatement(sql);

            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                Material ma = new Material();

                /*MATERIAL*/
                ma.setId_m(rs.getInt("id_m"));
                ma.setNombre_m(rs.getString("nombre_m"));
                ma.setDescripcion_m(rs.getString("descripcion_m"));
                ma.setCodigo_barra_m(rs.getString("codigo_barra_m"));
                ma.setCodigo_barra_original_m(rs.getString("codigo_barra_original_m"));

                /*MATERIAL_SUCURSAL*/
                ma.setId_dm(rs.getInt("id_dm"));
                ma.setMaximo_dm(rs.getInt("maximo_ms"));
                ma.setMinimo_dm(rs.getInt("minimo_ms"));
                ma.setUbicacion_dm(rs.getString("ubicacion_ms"));
                ma.setCosto_dm(rs.getDouble("costo_ms"));
                ma.setExistencia_dm(rs.getDouble("cantidad_ms"));
                ma.setEstado_ms(rs.getString("estado_ms"));

                /*CATEGORIA*/
                ma.setId_cat(rs.getInt("id_cat"));
                ma.setNombre_cat(rs.getString("nombre_cat"));

                /*SUB CATEGORIA*/
                ma.setId_su(rs.getInt("id_su"));
                ma.setNombre_su(rs.getString("nombre_su"));

                /*MARCA*/
                ma.setCodigo_m(rs.getInt("codigo_m"));
                ma.setNombre_marca(rs.getString("nombre_marca"));

                /*Tipo Material*/
                ma.setCodigo_tm(rs.getInt("codigo_tm"));
                ma.setNombre_tm(rs.getString("nombre_tm"));

                /*UNIDAD DE MEDICION*/
                ma.setId_um(rs.getInt("id_um"));
                ma.setNombre_um(rs.getString("nombre_um"));

                /*SUCURSAL*/
                ma.setCodigo_s(rs.getInt("codigo_s"));
                ma.setNombre_s(rs.getString("nombre_s"));
                lista.add(ma);
            }
            rs.close();
            ps.close();

            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<Material> getConsultaMateriales_x_Proveedor(Material m) throws Exception {
        List<Material> lista = new ArrayList<Material>();
        try {

            String sql = "SELECT m.id_m, m.id_um, m.id_su, m.codigo_tm, m.codigo_m, m.codigo_barra_m, m.codigo_barra_original_m , m.nombre_m, m.descripcion_m,ms.id_dm, ms.codigo_s ,ms.costo_ms ,ms.maximo_ms, ms.minimo_ms, ms.ubicacion_ms, ms.cantidad_ms, ms.estado_ms,s.nombre_s,  s.direccion_s, s.fax_s,cat.id_cat, cat.nombre_cat,su.nombre_su, tm.nombre_tm, mar.nombre_m as nombre_marca, um.nombre_um FROM MATERIAL AS m,MATERIAL_SUCURSAL AS ms,SUCURSAL AS s,CATEGORIA AS cat, SUB_CATEGORIA as su,TIPO_MATERIAL as tm,MARCA AS mar, UNIDAD_MEDICION AS um,DETA_COMPRA as dc,ENCA_COMPRA as c where m.id_m=ms.id_m and s.codigo_s=ms.codigo_s and cat.id_cat=su.id_cat and su.id_su=m.id_su and tm.codigo_tm=m.codigo_tm and mar.codigo_m=m.codigo_m and um.id_um=m.id_um and ms.estado_ms='A' ";
            sql += this.getFiltro_Material_categoria_subcategoria(m) + this.getFiltro_Material_marca(m) +  this.getFiltro_Material_Unidad(m) + this.getFiltro_Material_TipoMaterial(m) + this.getFiltro_Sucursal(m);
            sql += " group by m.id_m, m.id_um, m.id_su, m.codigo_tm, m.codigo_m, m.codigo_barra_m, m.codigo_barra_original_m , m.nombre_m, m.descripcion_m,ms.id_dm, ms.codigo_s ,ms.costo_ms ,ms.maximo_ms, ms.minimo_ms, ms.ubicacion_ms, ms.cantidad_ms, ms.estado_ms,s.nombre_s,  s.direccion_s, s.fax_s,cat.id_cat, cat.nombre_cat,su.nombre_su, tm.nombre_tm, mar.nombre_m, um.nombre_um ";
            sql += " order by s.nombre_s,cat.nombre_cat,su.nombre_su,m.nombre_m,m.codigo_barra_m ";

            System.out.println(sql);
            PreparedStatement ps = cConexion.conectar().prepareStatement(sql);

            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                Material ma = new Material();

                /*MATERIAL*/
                ma.setId_m(rs.getInt("id_m"));
                ma.setNombre_m(rs.getString("nombre_m"));
                ma.setDescripcion_m(rs.getString("descripcion_m"));
                ma.setCodigo_barra_m(rs.getString("codigo_barra_m"));
                ma.setCodigo_barra_original_m(rs.getString("codigo_barra_original_m"));

                /*MATERIAL_SUCURSAL*/
                ma.setId_dm(rs.getInt("id_dm"));
                ma.setMaximo_dm(rs.getInt("maximo_ms"));
                ma.setMinimo_dm(rs.getInt("minimo_ms"));
                ma.setUbicacion_dm(rs.getString("ubicacion_ms"));
                ma.setCosto_dm(rs.getDouble("costo_ms"));
                ma.setExistencia_dm(rs.getDouble("cantidad_ms"));
                ma.setEstado_ms(rs.getString("estado_ms"));

                /*CATEGORIA*/
                ma.setId_cat(rs.getInt("id_cat"));
                ma.setNombre_cat(rs.getString("nombre_cat"));

                /*SUB CATEGORIA*/
                ma.setId_su(rs.getInt("id_su"));
                ma.setNombre_su(rs.getString("nombre_su"));

                /*MARCA*/
                ma.setCodigo_m(rs.getInt("codigo_m"));
                ma.setNombre_marca(rs.getString("nombre_marca"));

                /*Tipo Material*/
                ma.setCodigo_tm(rs.getInt("codigo_tm"));
                ma.setNombre_tm(rs.getString("nombre_tm"));

                /*UNIDAD DE MEDICION*/
                ma.setId_um(rs.getInt("id_um"));
                ma.setNombre_um(rs.getString("nombre_um"));

                /*SUCURSAL*/
                ma.setCodigo_s(rs.getInt("codigo_s"));
                ma.setNombre_s(rs.getString("nombre_s"));
                lista.add(ma);
            }
            rs.close();
            ps.close();

            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private String getFiltro_Material_categoria_subcategoria(Material ma) {
        /*MAXIMO Y MINIMO*/
        try {
            String var_categoria = " ", var_subCategoria = " ";
            if (ma.getFlag_Categoria() == true && ma.getFlag_SubCategoria() == true) {
                var_categoria = " and cat.id_cat=" + ma.getId_cat() + " ";
                var_subCategoria = " and su.id_su=" + ma.getId_su() + " ";
            } else if (ma.getFlag_Categoria() == true) {
                var_categoria = " and cat.id_cat=" + ma.getId_cat() + " ";
            } else if (ma.getFlag_SubCategoria() == true) {
                var_subCategoria = " and su.id_su=" + ma.getId_su() + " ";
            }
            return var_categoria + var_subCategoria;
        } catch (Exception e) {
            return " ";
        }
    }

    private String getFiltro_Material_marca(Material ma) {
        try {
            String var_marca = " ";
            if (ma.getFlag_marca() == true && ma.getCodigo_m() != null) {
                var_marca = " and mar.codigo_m=" + ma.getCodigo_m() + " ";
            }
            return var_marca;
        } catch (Exception e) {
            return " ";
        }
    }

    private String getFiltro_Material_TipoMaterial(Material m) {
        try {
            String var_tipoMaterial= " ";
            if (m.getFlag_tipoMaterial() == true && m.getCodigo_tm() != null) {
                var_tipoMaterial = " and tm.codigo_tm=" + m.getCodigo_tm() + " ";
            }

            return var_tipoMaterial;
        } catch (Exception e) {
            return " ";
        }
    }

    private String getFiltro_Material_Unidad(Material m) {
        try {
            String var_unidad = " ";

            if (m.getFlag_unidadMedicion() == true && m.getId_um() != null) {
                var_unidad = " and um.id_um=" + m.getId_um() + " ";
            }
            return var_unidad;
        } catch (Exception e) {
            return " ";
        }
    }

    private String getFiltro_Sucursal(Material ma) {
        try {
            SessionControlador sc = new SessionControlador();
            String sucursal = " and s.codigo_s=" + sc.getCodigo_Sucursal() + " ";
            if (ma.getFlag_Sucursal() == true && ma.getCodigo_s() != null) {
                sucursal = " and s.codigo_s=" + ma.getCodigo_s() + " ";
            }
            return sucursal;
        } catch (Exception e) {
            return " ";
        }
    }
    /*RERPOTES*/

    public void generarReporte_MaximoMinimo(Material ma) throws Exception {
        try {

            String var_maximo = " ", var_minimo = " ", var_negativo = " ", var_producto = " ";
            String var_categoria = " ", var_sucursal = " ";

            if (ma.getFlag_maximo() == true) {
                var_maximo = " and ms.maximo_ms<=ms.cantidad_ms ";
            }
            if (ma.getFlag_minimo() == true) {
                var_minimo = " and ms.minimo_ms>= ms.cantidad_ms ";
            }
            if (ma.getFlag_negativo() == true) {
                var_negativo = " and ms.cantidad_ms<0 ";
            }
            if (ma.getId_m() != null) {
                var_producto = " and m.nombre_m like '%" + ma.getNombre_m() + "%' ";
            }

            var_categoria = this.getFiltro_Material_categoria_subcategoria(ma);
            var_sucursal = this.getFiltro_Sucursal(ma);
            String filtros = var_maximo + var_minimo + var_negativo + var_producto + var_categoria + var_sucursal;


            String sql = "select s.nombre_s,cat.nombre_cat,sc.nombre_su,m.nombre_m,m.codigo_barra_m,ms.cantidad_ms,ms.maximo_ms,ms.minimo_ms from material as m,material_sucursal as ms,CATEGORIA as cat,SUB_CATEGORIA as sc,SUCURSAL as s where m.id_m=ms.id_m and cat.id_cat=sc.id_cat and sc.id_su=m.id_su and s.codigo_s=ms.codigo_s and ms.estado_ms='A' " + filtros + " group by s.nombre_s,cat.nombre_cat,sc.nombre_su,m.nombre_m,m.codigo_barra_m,ms.cantidad_ms,ms.maximo_ms,ms.minimo_ms order by s.nombre_s,cat.nombre_cat,sc.nombre_su,m.nombre_m";

            System.out.println(sql);
            XMLReporte xml = new XMLReporte();
            xml.Element_XML(sql);

        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void generarReporte_ConteoFisico_Inventario(Material ma) throws Exception {
        try {

            String var_maximo = " ", var_minimo = " ", var_negativo = " ", var_producto = " ";
            String var_categoria = " ", var_sucursal = " ";

            if (ma.getId_m() != null) {
                var_producto = " and m.nombre_m like '%" + ma.getNombre_m() + "%' ";
            }

            var_categoria = this.getFiltro_Material_categoria_subcategoria(ma);
            var_sucursal = this.getFiltro_Sucursal(ma);

            String filtros = var_maximo + var_minimo + var_negativo + var_producto + var_categoria + var_sucursal;

            String sql = "select s.nombre_s,cat.nombre_cat,sc.nombre_su,m.nombre_m,m.codigo_barra_m,ms.cantidad_ms,ms.maximo_ms,ms.minimo_ms from material as m,material_sucursal as ms,CATEGORIA as cat,SUB_CATEGORIA as sc,SUCURSAL as s where m.id_m=ms.id_m and cat.id_cat=sc.id_cat and sc.id_su=m.id_su and s.codigo_s=ms.codigo_s and ms.estado_ms='A' " + filtros + " group by s.nombre_s,cat.nombre_cat,sc.nombre_su,m.nombre_m,m.codigo_barra_m,ms.cantidad_ms,ms.maximo_ms,ms.minimo_ms order by s.nombre_s,cat.nombre_cat,sc.nombre_su,m.nombre_m";
            XMLReporte xml = new XMLReporte();
            xml.Element_XML(sql);

        } catch (Exception e) {
            throw new Exception(e);
        }
    }
}
